﻿// C/C++ 学习网站：https://legacy.cplusplus.com 注意旧版本（搜索）和新版本
#include "study01.h"

//void MyClass1::print(int x)
//{ // 在类外定义公有成员函数，需要加上类名和 :: 符，注意函数名（包含参数）必须是类已有的
//    cout << "x = " << x << endl;
//}

/*
简单说明：
    1.vs 生成编译文件需设置：项目->属性->配置属性->C/C++->输出文件->
        汇编程序输出->仅有程序集的列表 (/FA)，调试或者运行后会生成 .asm 文件（汇编文件）
    2.编译代码优化：项目->属性->配置属性->C/C++->优化->最大优化(优选大小) (/O1)
        同时在 C/C++->较小类型检查->否；以及基本运行时检查->默认值
*/

extern float multiply_two_number_error(float a, float b);
// Link error: multiply_two_number_error is not defined

static void output_something(const char* fc(const char* massage)) {
    multiply_two_number_error(1.5f, 20.5f);
    //主接口没有调用则不会报错，因为 static 修饰函数，所以没有被调用之前都不会发生错误
    std::cout << fc << std::endl;
}

int main()
{
    std::cout << "Hello, world!" << std::endl;  // 输出到控制台，同C的 printf 函数
    //  << 也是一个运算符，用来连接字符串和变量，可以连续输出多个变量，也可以用 endl 换行
    //  endl 是一个宏，用来输出换行符，同 C 的 \n，cout 可以理解为一个函数
    std::cout << printf("Hello, world!") << std::endl;
    MyClass1 obj1;
    char name[50] = "welcome to C++ programming";
    obj1.print_name(name);
    printf("add_two_number(1.5f, 2.6f) = %f\n", add_two_number(1.5f, 2.6f));
    std::cout << "add_two_number(1, 2) = " << add_two_number(1, 2) << std::endl;
    //float num1, num2;
    //std::cout << "请输入一个数字：" << std::endl;
    //std::cin >> num1; // 从控制台读取输入
    //std::cout << "请再次输入一个数字：" << std::endl;
    //std::cin >> num2;
    //std::cout << "num1 * num2 = " << multiply_two_number(num1, num2) << std::endl;

    //output_something(&print_massage);

    extern void init_log();
    extern void test_log();
    init_log(); // 调用外部函数，注意 extern 关键字
    test_log(); // 调用外部函数，注意 extern 关键字
    log("This is a log message in main() function.");

    std::cout << "Press Enter key to quit..."; std::cin.get(); // 等待用户输入
    
    //system("pause"); // 等待用户输入
    return 0;
    // 编译器在引入头文件时，包含头文件会被直接复制到源文件中，
    // 因此头文件中定义的函数、变量等都会被编译器直接使用。
#include "end_bracket.h"